From 163c3c8852dd93dfe42454ee10adef9cdcfa5e44 Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Sun, 31 Oct 2010 18:55:51 +0900 Subject: [PATCH] Added margins to the cell area Added margin properties to the cell area, margins will be removed from the area given to ->render() when creating the inner cell area. --- gtk/gtkcellarea.c | 255 +++++++++++++++++++++++++++++++++++++++++++++- gtk/gtkcellarea.h | 18 ++++ 2 files changed, 270 insertions(+), 3 deletions(-) diff --git a/gtk/gtkcellarea.c b/gtk/gtkcellarea.c index dfee8ccf7f..fc269f1ed1 100644 --- a/gtk/gtkcellarea.c +++ b/gtk/gtkcellarea.c @@ -27,9 +27,11 @@ #include #include +#include "gtkintl.h" #include "gtkcelllayout.h" #include "gtkcellarea.h" #include "gtkcellareaiter.h" +#include "gtkprivate.h" #include @@ -37,6 +39,14 @@ /* GObjectClass */ static void gtk_cell_area_dispose (GObject *object); static void gtk_cell_area_finalize (GObject *object); +static void gtk_cell_area_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gtk_cell_area_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); /* GtkCellAreaClass */ static void gtk_cell_area_real_get_preferred_height_for_width (GtkCellArea *area, @@ -111,6 +121,8 @@ typedef struct { struct _GtkCellAreaPrivate { GHashTable *cell_info; + + GtkBorder border; }; /* Keep the paramspec pool internal, no need to deliver notifications @@ -120,6 +132,13 @@ static GParamSpecPool *cell_property_pool = NULL; #define PARAM_SPEC_PARAM_ID(pspec) ((pspec)->param_id) #define PARAM_SPEC_SET_PARAM_ID(pspec, id) ((pspec)->param_id = (id)) +enum { + PROP_0, + PROP_MARGIN_LEFT, + PROP_MARGIN_RIGHT, + PROP_MARGIN_TOP, + PROP_MARGIN_BOTTOM +}; G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkCellArea, gtk_cell_area, G_TYPE_INITIALLY_UNOWNED, G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT, @@ -139,6 +158,11 @@ gtk_cell_area_init (GtkCellArea *area) g_direct_equal, NULL, (GDestroyNotify)cell_info_free); + + priv->border.left = 0; + priv->border.right = 0; + priv->border.top = 0; + priv->border.bottom = 0; } static void @@ -147,8 +171,10 @@ gtk_cell_area_class_init (GtkCellAreaClass *class) GObjectClass *object_class = G_OBJECT_CLASS (class); /* GObjectClass */ - object_class->dispose = gtk_cell_area_dispose; - object_class->finalize = gtk_cell_area_finalize; + object_class->dispose = gtk_cell_area_dispose; + object_class->finalize = gtk_cell_area_finalize; + object_class->get_property = gtk_cell_area_get_property; + object_class->set_property = gtk_cell_area_set_property; /* general */ class->add = NULL; @@ -165,7 +191,48 @@ gtk_cell_area_class_init (GtkCellAreaClass *class) class->get_preferred_height_for_width = gtk_cell_area_real_get_preferred_height_for_width; class->get_preferred_width_for_height = gtk_cell_area_real_get_preferred_width_for_height; - /* Cell properties */ + /* Properties */ + g_object_class_install_property (object_class, + PROP_MARGIN_LEFT, + g_param_spec_int ("margin-left", + P_("Margin on Left"), + P_("Pixels of extra space on the left side"), + 0, + G_MAXINT16, + 0, + GTK_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_MARGIN_RIGHT, + g_param_spec_int ("margin-right", + P_("Margin on Right"), + P_("Pixels of extra space on the right side"), + 0, + G_MAXINT16, + 0, + GTK_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_MARGIN_TOP, + g_param_spec_int ("margin-top", + P_("Margin on Top"), + P_("Pixels of extra space on the top side"), + 0, + G_MAXINT16, + 0, + GTK_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_MARGIN_BOTTOM, + g_param_spec_int ("margin-bottom", + P_("Margin on Bottom"), + P_("Pixels of extra space on the bottom side"), + 0, + G_MAXINT16, + 0, + GTK_PARAM_READWRITE)); + + /* Pool for Cell Properties */ if (!cell_property_pool) cell_property_pool = g_param_spec_pool_new (FALSE); @@ -272,6 +339,62 @@ gtk_cell_area_dispose (GObject *object) G_OBJECT_CLASS (gtk_cell_area_parent_class)->dispose (object); } +static void +gtk_cell_area_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkCellArea *area = GTK_CELL_AREA (object); + + switch (prop_id) + { + case PROP_MARGIN_LEFT: + gtk_cell_area_set_margin_left (area, g_value_get_int (value)); + break; + case PROP_MARGIN_RIGHT: + gtk_cell_area_set_margin_right (area, g_value_get_int (value)); + break; + case PROP_MARGIN_TOP: + gtk_cell_area_set_margin_top (area, g_value_get_int (value)); + break; + case PROP_MARGIN_BOTTOM: + gtk_cell_area_set_margin_bottom (area, g_value_get_int (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gtk_cell_area_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GtkCellArea *area = GTK_CELL_AREA (object); + GtkCellAreaPrivate *priv = area->priv; + + switch (prop_id) + { + case PROP_MARGIN_LEFT: + g_value_set_int (value, priv->border.left); + break; + case PROP_MARGIN_RIGHT: + g_value_set_int (value, priv->border.right); + break; + case PROP_MARGIN_TOP: + g_value_set_int (value, priv->border.top); + break; + case PROP_MARGIN_BOTTOM: + g_value_set_int (value, priv->border.bottom); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} /************************************************************* * GtkCellAreaClass * @@ -1143,3 +1266,129 @@ gtk_cell_area_cell_get_property (GtkCellArea *area, } } +/* Margins */ +gint +gtk_cell_area_get_margin_left (GtkCellArea *area) +{ + g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0); + + return area->priv->border.left; +} + +void +gtk_cell_area_set_margin_left (GtkCellArea *area, + gint margin) +{ + GtkCellAreaPrivate *priv; + + g_return_if_fail (GTK_IS_CELL_AREA (area)); + + priv = area->priv; + + if (priv->border.left != margin) + { + priv->border.left = margin; + + g_object_notify (G_OBJECT (area), "margin-left"); + } +} + +gint +gtk_cell_area_get_margin_right (GtkCellArea *area) +{ + g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0); + + return area->priv->border.right; +} + +void +gtk_cell_area_set_margin_right (GtkCellArea *area, + gint margin) +{ + GtkCellAreaPrivate *priv; + + g_return_if_fail (GTK_IS_CELL_AREA (area)); + + priv = area->priv; + + if (priv->border.right != margin) + { + priv->border.right = margin; + + g_object_notify (G_OBJECT (area), "margin-right"); + } +} + +gint +gtk_cell_area_get_margin_top (GtkCellArea *area) +{ + g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0); + + return area->priv->border.top; +} + +void +gtk_cell_area_set_margin_top (GtkCellArea *area, + gint margin) +{ + GtkCellAreaPrivate *priv; + + g_return_if_fail (GTK_IS_CELL_AREA (area)); + + priv = area->priv; + + if (priv->border.top != margin) + { + priv->border.top = margin; + + g_object_notify (G_OBJECT (area), "margin-top"); + } +} + +gint +gtk_cell_area_get_margin_bottom (GtkCellArea *area) +{ + g_return_val_if_fail (GTK_IS_CELL_AREA (area), 0); + + return area->priv->border.bottom; +} + +void +gtk_cell_area_set_margin_bottom (GtkCellArea *area, + gint margin) +{ + GtkCellAreaPrivate *priv; + + g_return_if_fail (GTK_IS_CELL_AREA (area)); + + priv = area->priv; + + if (priv->border.bottom != margin) + { + priv->border.bottom = margin; + + g_object_notify (G_OBJECT (area), "margin-bottom"); + } +} + +/* For convenience in area implementations */ +void +gtk_cell_area_inner_area (GtkCellArea *area, + GdkRectangle *background_area, + GdkRectangle *cell_area) +{ + GtkCellAreaPrivate *priv; + + g_return_if_fail (GTK_IS_CELL_AREA (area)); + g_return_if_fail (background_area != NULL); + g_return_if_fail (cell_area != NULL); + + priv = area->priv; + + *cell_area = *background_area; + + cell_area->x += priv->border.left; + cell_area->width -= (priv->border.left + priv->border.right); + cell_area->y += priv->border.top; + cell_area->height -= (priv->border.top + priv->border.bottom); +} diff --git a/gtk/gtkcellarea.h b/gtk/gtkcellarea.h index 4e71ee4f23..a6f06ec4ad 100644 --- a/gtk/gtkcellarea.h +++ b/gtk/gtkcellarea.h @@ -238,6 +238,24 @@ void gtk_cell_area_cell_get_property (GtkCellArea #define GTK_CELL_AREA_WARN_INVALID_CHILD_PROPERTY_ID(object, property_id, pspec) \ G_OBJECT_WARN_INVALID_PSPEC ((object), "cell property id", (property_id), (pspec)) +/* Margins */ +gint gtk_cell_area_get_margin_left (GtkCellArea *area); +void gtk_cell_area_set_margin_left (GtkCellArea *area, + gint margin); +gint gtk_cell_area_get_margin_right (GtkCellArea *area); +void gtk_cell_area_set_margin_right (GtkCellArea *area, + gint margin); +gint gtk_cell_area_get_margin_top (GtkCellArea *area); +void gtk_cell_area_set_margin_top (GtkCellArea *area, + gint margin); +gint gtk_cell_area_get_margin_bottom (GtkCellArea *area); +void gtk_cell_area_set_margin_bottom (GtkCellArea *area, + gint margin); + +/* For convenience in area implementations */ +void gtk_cell_area_inner_area (GtkCellArea *area, + GdkRectangle *background_area, + GdkRectangle *cell_area); G_END_DECLS -- 2.30.2